package com.neuedu.my12306.web;

import java.io.File;
import java.io.IOException;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

import com.neuedu.my12306.entity.UserInfo;
import com.neuedu.my12306.service.IUserInfoService;
import com.neuedu.my12306.util.DateUtil;
import com.neuedu.my12306.util.SpringContextUtil;
import com.neuedu.my12306.util.StringUtil;

/**
 * <pre>
 * 	1.使用了multipart/form-data编码 表单数据后，不能直接使用request.getParameter()方法获取参数
 * 	2.在servlet3.0后可以对servlet进行声明：@MultipartConfig,声明后才能使用request.getParameter()方法获取参数
 * 	3.获取文件流使用:Collection<Part> files = request.getParts();   文件流会封装到一个Collection集合的Part对象中
 * 	4.可以遍历Part集合，取出每一个文件流，并进行上传；可以一次处理第一个文件的上传；
 * </pre>
 * 
 * @author admin
 *
 */
@WebServlet("/DoEditUserServlet.do")
@MultipartConfig(maxFileSize = 5 * 1024 * 1024, maxRequestSize = 200 * 1024 * 1024)
public class DoEditUserServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private IUserInfoService userInfoService;

	public DoEditUserServlet() {
		super();
		 //使用IUserInfoService接口解耦合 CheckUserNameServlet  与IUserInfoServiceImpl 的耦合关系
	       // userInfoService = new IUserInfoServiceImpl();
	        userInfoService = SpringContextUtil.getBean("userService", IUserInfoService.class);

	}

	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		boolean ret = false;
		String userName = request.getParameter("userName");
		String trueName = request.getParameter("trueName");
		String sex = request.getParameter("sex");
		String province = request.getParameter("province");
		String city = request.getParameter("city");
		String cardType = request.getParameter("cardType");
		String idNumber = request.getParameter("idNumber");
		String passengerType = request.getParameter("passengerType");
		String tips = request.getParameter("tips");
		String birthDate = request.getParameter("birthDate");
		Date birthDate2 = DateUtil.pareDate(birthDate);
		String userPowerString = request.getParameter("userPower");
		int userPower = StringUtil.parseInt(userPowerString, 0);
		UserInfo userInfo = userInfoService.findUserInfoByid(userName);
		if (userInfo != null) {
			userInfo.setBirthDate(birthDate2);
			userInfo.setCardType(cardType);
			userInfo.setCity(city);
			userInfo.setIdNumber(idNumber);
			userInfo.setPassengerType(passengerType);
			userInfo.setProvince(province);
			userInfo.setSex(sex);
			userInfo.setTips(tips);
			userInfo.setTrueName(trueName);
			userInfo.setUserPower(userPower);
			//一般密码需要另外修改
			//userInfo.setUserpass(userpass);
			
			

			// 使用了multipart/form-data编码 表单数据后，不能直接使用request.getParameter()方法获取参数
			// String filed1 = request.getParameter("filed1");

			System.out.println("userName::::::" + userName);
			// 获取服务器的上传的真实目录
			String realPath = request.getServletContext().getRealPath("/");

			// 当需要上传大量文件时，需要分目录管理；目录一般需要动态生成
			// 下例使用时间管理文件，根据上传的日期动态生成文件夹
			// uploads/2019/10/10 2019/10/11
			// uploads/20191010 20191011
			// uploads/201910 201910
			Calendar calendar = Calendar.getInstance();
			int year = calendar.get(Calendar.YEAR);
			int month = calendar.get(Calendar.MONTH) + 1;
			int day = calendar.get(Calendar.DAY_OF_MONTH);

			// 动态生成文件路径
			String newPath = "uploads/" + year + "/" + month + "/" + day;

			File realFile = new File(realPath + newPath);
			realFile.mkdirs();

			// 所有的表单数据都会封装到Part对象中，包含text，checkbox，radio，file等等；
			Collection<Part> files = request.getParts();

			for (Part part : files) {

				String fileName = part.getSubmittedFileName();

				long fileSize = part.getSize();
				if (fileName != null && fileName.trim().length() != 0) {

					System.out.println("fileName::::::" + fileName);
					System.out.println("fileSize::::::" + fileSize);
					// fileName这是上传的源文件，可能包含有不雅的信息或可能有多个用户上传名称相同的文件
					// 一般需要进行重命名上传后的文件
					String fileType = fileName.substring(fileName.lastIndexOf("."));
					System.out.println(":::" + fileType);
					// 使用时间戳或UUID算法生成的编号重命名上传后的文件
					long now = System.currentTimeMillis();
					// UUID.randomUUID();
					String newFileName = newPath + "/" + now + fileType;
					//将文件名上传到数据库
					userInfo.setHeadImage(newFileName);
					// 把而文件写到服务器的磁盘路径(服务器的文件名)
					String outPutFileName = realPath + "/" + newFileName;
					part.write(outPutFileName);
					// 上传完毕后，删除临时文件
					part.delete();
				}

			}
			ret = userInfoService.editUserInfo(userInfo);
		}
		if (ret) {
			request.getSession().setAttribute("MSG", "修改成功");
		}else {
			request.getSession().setAttribute("MSG", "修改失败");
		}
		
		request.getSession().setAttribute("BACKURL", request.getContextPath() + "/UserAdminServlet.do");
		response.sendRedirect(request.getContextPath() + "/error.jsp");
	}

}
